package com.gsdl.web.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.apache.log4j.Logger;

import com.gsdl.model.delegate.BusinessDelegate;
import com.gsdl.model.entity.Centro;
import com.gsdl.model.entity.Deposito;
import com.gsdl.model.entity.Deposito.TipoDeposito;
import com.gsdl.model.entity.Movimento;
import com.gsdl.model.entity.Stock;
import com.gsdl.web.util.JsfUtil;


// TODO: Auto-generated Javadoc
/**
 * The Class CentroController.
 *
 * @author Natacha Antonopoulos
 */

@ManagedBean
@ViewScoped
public class CentroController implements Serializable{
	
	/** The Constant serialVersionUID. */
	private static final long serialVersionUID = -3514274681015310973L;
	
	/** The Constant LOG. */
	private static final Logger LOG = Logger.getLogger(CentroController.class.getName());
	
	/** The centro. */
	private Centro centro = new Centro();
	
	/** The novo centro. */
	private Centro novoCentro = new Centro();
	
	/** The centros. */
	private List<Centro> centros = new ArrayList<Centro>();
	
	/** The depositos. */
	private List<Deposito> depositos = new ArrayList<Deposito>();
	
	/** The deposito. */
	private Deposito deposito = new Deposito();
	
	/** The novo deposito. */
	private Deposito novoDeposito = new Deposito();
	
	/** The deposito stock. */
	private List<Stock> depositoStock = new ArrayList<Stock>();

	/**
	 * Inits the.
	 * 
	 * Check if there is a centroId or a depositoId as a request parameter. If there is sets the centro/deposito for details view
	 * 
	 */
	@PostConstruct
	private void init() {
		String centroId = JsfUtil.getRequestParameter("centroId");
		if(centroId != null && !centroId.equals(""))
			centro = BusinessDelegate.getInstance().getCentroById(Long.parseLong(centroId));
		
		String depositoId = JsfUtil.getRequestParameter("depositoId");
		if(depositoId != null && !depositoId.equals(""))
			deposito = BusinessDelegate.getInstance().getDepositoById(Long.parseLong(depositoId));
	}
	
	
	/** The movimentos. */
	private List<Movimento> movimentos = new ArrayList<Movimento>();
	
	/**
	 * Save new centro action.
	 *
	 * @return the string
	 */
	public String saveNewCentroAction(){
		try{
			BusinessDelegate.getInstance().saveCentro(novoCentro);
		}catch (Exception ex) {
			JsfUtil.addErrorMessage("Erro ao registrar cento");
	    }
		return "centroDepositos";
	}
	
	/**
	 * Save centro action.
	 *
	 * @return the string
	 */
	public String saveCentroAction(){
		try{
			BusinessDelegate.getInstance().saveCentro(centro);
		}catch (Exception ex) {
			JsfUtil.addErrorMessage("Erro ao registrar cento");
	    }
		return "centroDepositos";
	}
	
	/**
	 * Save new deposito action.
	 *
	 * @return the string
	 */
	public String saveNewDepositoAction(){
		try{
			BusinessDelegate.getInstance().saveDeposito(novoDeposito);
		}catch (Exception ex) {
			JsfUtil.addErrorMessage("Erro ao registrar depósito");
	    }
		return "centroDepositos";
	}
	
	
	/**
	 * Save deposito action.
	 *
	 * @return the string
	 */
	public String saveDepositoAction(){
		try{
			if(deposito.getCentro().getId() == null || deposito.getCentro().getId().equals(0L))
				deposito.setCentro(null);
			BusinessDelegate.getInstance().saveDeposito(deposito);
		}catch (Exception ex) {
			JsfUtil.addErrorMessage("Erro ao registrar centro");
	    }
		return "centroDepositos";
	}
	
	/**
	 * Removes the centro.
	 *
	 * @param centro the centro
	 * @return the string
	 */
	public String removeCentro(Centro centro){
		BusinessDelegate.getInstance().removeCentro(centro);
		getCentros();
		return "";
	}
	
	/**
	 * Removes the deposito.
	 *
	 * @param deposito the deposito
	 * @return the string
	 */
	public String removeDeposito(Deposito deposito){
		BusinessDelegate.getInstance().removeDeposito(deposito);
		getDepositos();
		return "";
	}
		
	/**
	 * Gets the centro depositos.
	 *
	 * @return the centro depositos
	 */
	public List<Deposito> getCentroDepositos() {
		if(centro == null || centro.getId() == null)
			return new ArrayList<Deposito>(); 

		return BusinessDelegate.getInstance().getDepositoByCentro(centro);
	}
	
	
	/**
	 * Gets the depositos de expedicao by centro.
	 *
	 * @return the centro depositos expedicao
	 */
	public List<Deposito> getCentroDepositosExpedicao() {
		if(centro == null || centro.getId() == null)
			return new ArrayList<Deposito>(); 

		return BusinessDelegate.getInstance().getDepositoExpedicaoByCentro(centro);
	}
	
	/**
	 * Gets the depositos de armazenamento by centro
	 *
	 * @return the centro depositos armazenamento
	 */
	public List<Deposito> getCentroDepositosArmazenamento() {
		if(centro == null || centro.getId() == null)
			return new ArrayList<Deposito>(); 

		return BusinessDelegate.getInstance().getDepositoArmazenamentoByCentro(centro);
	}

	/**
	 * Gets the depositos armazenamento.
	 *
	 * @return the depositos armazenamento
	 */
	public List<Deposito> getDepositosArmazenamento() {
		return BusinessDelegate.getInstance().getDepositosArmazenamento();
	}
	
	/**
	 * Novo deposito.
	 *
	 * @return the string
	 */
	public String novoDeposito(){
		return "novoDeposito";
	}
	

	/**
	 * Novo centro.
	 *
	 * @return the string
	 */
	public String novoCentro(){
		return "novoCentro";
	}
	
	/**
	 * Gets the tipos deposito.
	 *
	 * @return the tipos deposito
	 */
	public TipoDeposito[] getTiposDeposito() {
		return TipoDeposito.values();
	}

	
	/**
	 * Gets the centro.
	 *
	 * @return the centro
	 */
	public Centro getCentro() {
		if(centro == null)
			centro = new Centro();
		return centro;
	}
	
	/**
	 * Sets the centro.
	 *
	 * @param centro the centro to set
	 */
	public void setCentro(Centro centro) {
		this.centro = centro;
	}
	
	/**
	 * Gets the novo centro.
	 *
	 * @return the novoCentro
	 */
	public Centro getNovoCentro() {
		return novoCentro;
	}
	
	/**
	 * Sets the novo centro.
	 *
	 * @param novoCentro the novoCentro to set
	 */
	public void setNovoCentro(Centro novoCentro) {
		this.novoCentro = novoCentro;
	}
	
	/**
	 * Gets the centros.
	 *
	 * @return the centros
	 */
	public List<Centro> getCentros() {
		centros = BusinessDelegate.getInstance().getAllCentros();
		return centros;
	}
	
	/**
	 * Sets the centros.
	 *
	 * @param centros the centros to set
	 */
	public void setCentros(List<Centro> centros) {
		this.centros = centros;
	}
	
	/**
	 * Gets the depositos.
	 *
	 * @return the depositos
	 */
	public List<Deposito> getDepositos() {
		depositos = BusinessDelegate.getInstance().getAllDepositos();
		return depositos;
	}
	
	/**
	 * Sets the depositos.
	 *
	 * @param depositos the depositos to set
	 */
	public void setDepositos(List<Deposito> depositos) {
		this.depositos = depositos;
	}
	
	/**
	 * Gets the deposito.
	 *
	 * @return the deposito
	 */
	public Deposito getDeposito() {
		return deposito;
	}
	
	/**
	 * Sets the deposito.
	 *
	 * @param deposito the deposito to set
	 */
	public void setDeposito(Deposito deposito) {
		this.deposito = deposito;
	}
	
	/**
	 * Gets the novo deposito.
	 *
	 * @return the novoDeposito
	 */
	public Deposito getNovoDeposito() {
		return novoDeposito;
	}
	
	/**
	 * Sets the novo deposito.
	 *
	 * @param novoDeposito the novoDeposito to set
	 */
	public void setNovoDeposito(Deposito novoDeposito) {
		this.novoDeposito = novoDeposito;
	}

	/**
	 * Gets the deposito stock.
	 *
	 * @return the depositoStock
	 */
	public List<Stock> getDepositoStock() {
		return depositoStock;
	}

	/**
	 * Sets the deposito stock.
	 *
	 * @param depositoStock the depositoStock to set
	 */
	public void setDepositoStock(List<Stock> depositoStock) {
		this.depositoStock = depositoStock;
	}

	/**
	 * Gets the movimentos.
	 *
	 * @return the movimentos
	 */
	public List<Movimento> getMovimentos() {
		this.movimentos = BusinessDelegate.getInstance().getMovimentosByDeposito(deposito);
		return movimentos;
	}

	/**
	 * Sets the movimentos.
	 *
	 * @param movimentos the movimentos to set
	 */
	public void setMovimentos(List<Movimento> movimentos) {
		this.movimentos = movimentos;
	}

}
